package Q4_11_Random_Node;
import java.util.Random;
/* One node of a binary tree. The data element stored is a single
* character.
*/
public class TreeNode {
public int data;
public TreeNode left;
public TreeNode right;
private int size = 0;
public TreeNode(int d) {
data = d;
size = 1;
}
public void insertInOrder(int d) {
if (d <= data) {
if (left == null) {
left = new TreeNode(d);
} else {
left.insertInOrder(d);
}
} else {
if (right == null) {
right = new TreeNode(d);
} else {
right.insertInOrder(d);
}
}
size++;
}
public int size() {
return size;
}
public TreeNode find(int d) {
if (d == data) {
return this;
} else if (d <= data) {
return left != null ? left.find(d) : null;
} else if (d > data) {
return right != null ? right.find(d) : null;
}
return null;
}
public TreeNode getRandomNode() {
int leftSize = left == null ? 0 : left.size();
Random random = new Random();
int index = random.nextInt(size);
if (index < leftSize) {
return left.getRandomNode();
} else if (index == leftSize) {
return this;
} else {
return right.getRandomNode();
}
}
public TreeNode getIthNode(int i) {
int leftSize = left == null ? 0 : left.size();
if (i < leftSize) {
return left.getIthNode(i);
} else if (i == leftSize) {
return this;
} else {
return right.getIthNode(i - (leftSize + 1));
}
}
}